package main

import "fmt"

// 引出接口的实例

type cat struct {
}

type dog struct {
}
type person struct {
}

type seraker interface {
	speak()
}

func (c cat) speak() {
	fmt.Println("喵喵苗")
}

func (d dog) speak() {
	fmt.Println("汪汪汪")
}

func do(x seraker) {
	// 接一个参数， 传进来什么就打印什么
	x.speak()
}

func (p person) speak() {
	fmt.Println("aaaa")
}

// 不管什么车子动能跑

type car interface {
	run()
}

type falali struct {
	brand string
}

type baoshijie struct {
	brand string
}

func drive(c car) {
	car.run(c)
}

func (f falali) run() {
	fmt.Printf("%s速度70迈~", f.brand)
}

func (f baoshijie) run() {
	fmt.Printf("%s速度68迈~", f.brand)
}

// 在编程中遇到的场景
// 不关心一个变量什么类型， 只关心能调用它的什么方法
// 接口是一种类型，是一种特殊的类型，它规定了变量有哪些方法
func main() {
	var c1 cat
	var d1 dog
	var p1 person
	do(c1)
	do(d1)
	do(p1)

	var f1 = falali{
		brand: "法拉利",
	}

	var b1 = baoshijie{
		brand: "保时捷",
	}

	drive(f1)
	drive(b1)
}
